[1987] 알파벳 Success

Posted by ChaelinJ on May 10, 2021

문제

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.

말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.

좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.

입력

첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1 ≤ R,C ≤ 20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.

출력

첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.


접근

  • DFS (깊이우선탐색)
  • 백트래킹

해당 알파벳일 이전에 거쳐간 적이 있는지 확인하는 부분을 포함한 DFS 문제입니다.

저는 boolean 배열으로 정보를 저장했고, index를 알파벳으로 했습니다.

예로 ‘A’일 때, A의 아스키코드인 65를 index로 이용해 boolean 배열에서 확인합니다.

boolean[] flags = new boolean[100];
char c = 'A';
flags[c] = true;

이번엔 스택이 아닌 재귀를 이용했습니다.

한 번의 재귀를 끝내고 돌아왔을 때, 이전 flags 정보 상태로 돌아가야 합니다.

flags[x] = true;
rDFS();
flags[x] = false;

이런 식으로 재귀 전에 바꾸고, 재귀 후 원복하는 형태로 원래 정보를 유지합니다.

Solution

Method Return Description
Solution(int R, int C, char[][] arr) - 필요한 정보를 저장하는 생성자
rDFS(int x, int y, boolean[] alCheck) int 재귀를 통해 DFS를 수행하는 메소드로, 최대 방문 칸 수를 반환합니다.
solution() int 초기 상태를 지정해 rDFS를 호출하는 메소드입니다.

결과

사용 연어: Java 11

메모리 시간
16500 KB 1068 ms

감사합니다.

Text by Chaelin. Photographs by Chaelin, Unsplash.